#include"DList.h"

DLN* BuyDListNode(Value x)//开辟空间
{
    DLN *NewNode=(DLN *)malloc(sizeof(DLN));
    NewNode->data=x;
    NewNode->next=NULL;
    NewNode->prev=NULL;
    return NewNode;

}

DLN *DListNodeInit(DLN**phead)//初始化
{
    DLN *Nenode=BuyDListNode(0);
    Nenode->data=0;
    Nenode->next=Nenode;
    Nenode->prev=Nenode;
    *phead=Nenode;
}

void DListNodePushBack(DLN **phead,int num)//尾插
{
    DLN *cur=(*phead)->prev;
    DLN*newnode= BuyDListNode(num);
   cur->next=newnode;
   newnode->prev=newnode;
   newnode->next=*phead;
    (*phead)->prev=newnode;
}
void DListNodePopBack(DLN **phead)//尾删
{
    DLN *tail=(*phead)->prev;
    DLN *newtail=tail->prev;
    free(tail);
    (*phead)->prev=newtail;
    newtail->next=(*phead);
}
void DListNodePushFront(DLN **phead,int num)//头插
{
    DLN *OldHead=(*phead)->next;
    DLN *newnode=BuyDListNode(num);
    (*phead)->next=newnode;
    newnode->prev=(*phead);
    newnode->next=OldHead;
    OldHead->prev=newnode;
}
void DListNodePophFront(DLN **phead)//头删
{
    DLN *OldHead=(*phead)->next;
    DLN*newhead=OldHead->next;
    free(OldHead);
    (*phead)->next=newhead;
    newhead->prev=(*phead);
}

DLN *DListNodeFind(DLN **phead,int num)//查找
{
    DLN *cur=(*phead)->next;
    while(cur->next!=*phead)
    {
        if(cur->data==num)
        {
            return cur;
        }
        cur=cur->next;
    }
    return NULL;
}


void DListNodePushInsert(DLN **pos,int num)//pos位插入
{
    //pos位尾插
//    DLN *next= (*pos)->next;
//    DLN *newnode=BuyDListNode(num);
//    (*pos)->next=newnode;
//    newnode->prev=(*pos);
//    newnode->next->next;
//    next->prev=newnode;
    //pos头插
    DLN *prev= (*pos)->prev;
    DLN *newnode=BuyDListNode(num);
    prev->next=newnode;
    newnode->prev=prev;
    newnode->next=(*pos);
    (*pos)->prev=newnode;
}
void DListNodePopInsert(DLN **pos)//pos位删除
{
    //pos位后插
    DLN *next= (*pos)->next;
    DLN *nextnext=next->next;
    free(next);
    (*pos)->next=nextnext;
    nextnext->prev= (*pos);
   // pos位前删
//    DLN *prevprev=prec->prev;
//    free(prev);
//    prevprev->next=(*pos);
//    (*pos)->prev=prevprev;
}
void DListNode(DLN **phead)
{
  while((*phead)->next==(*phead)->prev)
  {
      DLN *tail=(*phead)->prev;
      DLN *newtail=tail->next;
      free(tail);
      newtail->next=(*phead);
      (*phead)->prev=tail;
  }
  if((*phead)->next==NULL)
  {
      ;
  }
  else
  {
      free((*phead)->next);
      free(*phead);
  }
}